#pragma once
// 封装线程库
#include <iostream>
#include <string>
#include <pthread.h>
#include <functional>
#include <unistd.h>

// 个人封装的线程库，用来描述线程
// 为此，我们需要拥有线程的名字，线程的ID，线程的状态，线程的回调函数，传递给回调函数的参数。
// 那么参数参数也就齐了

// 下面就是线程库的方法，线程库一个具有上面方法呢？
// 只需要拥有回调方法，和启动线程的方法，以及一些暴露给外界的接口即可

enum Status
{
    STOP = 0, // 已退出
    RUNNING   // 运行中
};

// 参数为string,返回值为void的函数类型
//  typedef void (*func_t)(std::string);
using func_t = std::function<void(std::string)>;
namespace yui
{
    class Thread
    {
    public:
        Thread(func_t func, std::string name = "None")
            : _func(func), _threadName(name), _status(STOP)
        {
        }
        ~Thread()
        {
        }
        static void *threadRun(void *arg)
        {
            Thread *self = static_cast<Thread *>(arg);
            self->Excute();
            return nullptr;
        }
        void Excute()
        {
            _func(_threadName);
        }
        bool Start()
        {
            int n = pthread_create(&_threadId, nullptr, threadRun, this);
            if (n!=-1)
            {
                _status = RUNNING;
                return true;
            }
            else
            {
                return false;
            }
        }
        void Detach()
        {
            if (_status) // 运行时，断开连接
            {
                pthread_detach(_threadId);
            }
        }
        void Join()
        {
            if (_status == RUNNING) // 运行时才能等待成功
            {
                pthread_join(_threadId, nullptr);
            }
        }
        std::string name()
        {
            return _threadName;
        }
        void Stop()
        {
            _status = STOP;
        }

    private:
        pthread_t _threadId;
        std::string _threadName;
        Status _status;
        func_t _func;
    };

} // namespace yui
